/***************************************************************************  
 * Copyright (C) 1995-2002 MySQL AB, www.mysql.com                         *
 *                                                                         *
 * This program is free software; you can redistribute it and/or modify    *
 * it under the terms of the GNU General Public License as published by    *
 * the Free Software Foundation; either version 2 of the License, or       *
 * (at your option) any later version.                                     *
 *                                                                         *
 * This program is distributed in the hope that it will be useful,         *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
 * GNU General Public License for more details.                            *
 *                                                                         *
 * You should have received a copy of the GNU General Public License       *
 * along with this program; if not, write to the Free Software Foundation  *
 * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA           *
****************************************************************************/

/*************************************************************************** 
 * MYUTIL.H                                                                *
 *                                                                         *
 * @description: Prototype definations needed by the driver                *
 *                                                                         *
 * @author     : MySQL AB(monty@mysql.com, venu@mysql.com)                 *
 * @date       : 2001-Sep-22                                               *
 * @product    : myodbc3                                                   *
 *                                                                         *
****************************************************************************/
#ifndef __MYUTIL_H__
#define __MYUTIL_H__

/* 
  Utility macros
*/

#define if_dynamic_cursor(st) ((st)->stmt_options.cursor_type == SQL_CURSOR_DYNAMIC)
#define if_forward_cache(st) ((st)->stmt_options.cursor_type == SQL_CURSOR_FORWARD_ONLY && \
                             (st)->dbc->flag & FLAG_NO_CACHE )
#define trans_supported(db) ((db)->mysql.server_capabilities & CLIENT_TRANSACTIONS)
#define autocommit_on(db) ((db)->mysql.server_status & SERVER_STATUS_AUTOCOMMIT)

#if !defined(DBUG_OFF)

#define MYLOG_QUERY(A,B) if((A)->dbc->flag & FLAG_LOG_QUERY) \
                           query_print((A)->dbc->query_log,(char *)B)

#define MYLOG_DBC_QUERY(A,B) if((A)->flag & FLAG_LOG_QUERY) \
                           query_print((A)->query_log,(char *)B)

#define DBUG_RETURN_STATUS(r) \
  { \
    SQLRETURN rc= r; \
    switch (rc) { \
    case 0: \
      DBUG_PRINT("exit ",("SQL_SUCCESS")); \
      break; \
    case 1: \
      DBUG_PRINT("exit ",("SQL_SUCCESS_WITH_INFO")); \
      break; \
    case -1: \
      DBUG_PRINT("exit ",("SQL_ERROR")); \
      break; \
    case 100: \
      DBUG_PRINT("exit ",("SQL_NO_DATA_FOUND")); \
      break; \
    case 99: \
      DBUG_PRINT("exit ",("SQL_NEED_DATA")); \
      break; \
    default: \
      DBUG_PRINT("exit ",("INVALID_ERROR_CODE")); \
    } \
    DBUG_RETURN(rc); \
  } 
#else
#define DBUG_RETURN_STATUS(r) return(r)
#define MYLOG_QUERY
#define MYLOG_DBC_QUERY
#endif

/*
  Utility function prototypes that share among files
*/

SQLRETURN my_SQLExecute(STMT FAR* stmt);
SQLRETURN my_SQLPrepare(SQLHSTMT hstmt,SQLCHAR FAR *szSqlStr,
			SQLINTEGER cbSqlStr);
SQLRETURN SQL_API my_SQLFreeStmt(SQLHSTMT hstmt,SQLUSMALLINT fOption);
SQLRETURN SQL_API my_SQLAllocStmt(SQLHDBC hdbc,SQLHSTMT FAR *phstmt);
SQLRETURN do_query(STMT FAR *stmt,char *query);
char *insert_params(STMT FAR *stmt);
SQLRETURN odbc_stmt(DBC FAR *dbc, const char *query);
void mysql_link_fields(STMT *stmt,MYSQL_FIELD *fields,uint field_count);
void fix_result_types(STMT *stmt);
char *fix_str(char *to,char *from,int length);
char *dupp_str(char *from,int length);
bool empty_str(char *from,int length);
SQLRETURN my_pos_delete(STMT FAR *stmt,STMT FAR *stmtParam,
			SQLUSMALLINT irow,DYNAMIC_STRING *dynStr);
SQLRETURN my_pos_update(STMT FAR *stmt,STMT FAR *stmtParam,
			SQLUSMALLINT irow,DYNAMIC_STRING *dynStr);
my_bool check_if_positioned_cursor_exists(STMT FAR *stmt,
					  STMT FAR **stmtNew);
char *insert_param(MYSQL *mysql, char *to,PARAM_BIND *param);
char *add_to_buffer(NET *net,char *to,char *from,ulong length);
SQLRETURN copy_lresult(SQLSMALLINT HandleType, SQLHANDLE handle,
           SQLCHAR FAR *rgbValue, SQLINTEGER cbValueMax, 
           SQLINTEGER FAR *pcbValue, char *src,
           long src_length, long max_length,
		       long fill_length,long *offset,my_bool binary_data);
SQLRETURN copy_binary_result(SQLSMALLINT HandleType, SQLHANDLE handle,
           SQLCHAR FAR *rgbValue, SQLINTEGER cbValueMax, 
           SQLINTEGER FAR *pcbValue, char *src, 
           ulong src_length, ulong max_length,
			     ulong *offset);
SQLRETURN set_dbc_error(DBC FAR *dbc, char *state,const char *message,uint errcode);
SQLRETURN set_stmt_error(STMT *stmt, char *state,const char *message,uint errcode);
void translate_error(char *save_state,myodbc_errid errid,uint mysql_err);
int unireg_to_sql_datatype(STMT FAR *stmt, MYSQL_FIELD *field, char *buff,
			   ulong *transfer_length,ulong *precision,
			   ulong *display_size);
SQLRETURN SQL_API my_SQLBindParameter(SQLHSTMT hstmt,SQLUSMALLINT ipar,
				      SQLSMALLINT fParamType,
				      SQLSMALLINT fCType, SQLSMALLINT fSqlType,
				      SQLUINTEGER cbColDef,
				      SQLSMALLINT ibScale,
				      SQLPOINTER  rgbValue,
				      SQLINTEGER cbValueMax,
				      SQLINTEGER FAR *pcbValue);
SQLRETURN SQL_API my_SQLExtendedFetch(SQLHSTMT hstmt, SQLUSMALLINT fFetchType,
				      SQLINTEGER irow, SQLUINTEGER FAR *pcrow,
				      SQLUSMALLINT FAR *rgfRowStatus);
SQLRETURN copy_stmt_error(STMT FAR *src, STMT FAR *dst);
int unireg_to_c_datatype(MYSQL_FIELD *field);
int default_c_type(int sql_data_type);
ulong bind_length(int sql_data_type,ulong length);
my_bool str_to_date(DATE_STRUCT *rgbValue, const char *str,uint length);
ulong str_to_time(const char *str,uint length);
void init_getfunctions(void);
void myodbc_init(void);
void myodbc_ov_init(SQLUSMALLINT odbc_version);
void myodbc_sqlstate2_init(void);
void myodbc_sqlstate3_init(void);
int check_if_server_is_alive(DBC FAR *dbc);
my_bool dynstr_append_quoted_name(DYNAMIC_STRING *str, const char *name);
SQLRETURN set_handle_error(SQLSMALLINT HandleType, SQLHANDLE handle,
     myodbc_errid errid, const char *errtext, SQLINTEGER errcode);
SQLRETURN set_error(STMT *stmt,myodbc_errid errid, const char *errtext,
		    SQLINTEGER errcode);
SQLRETURN set_conn_error(DBC *dbc,myodbc_errid errid, const char *errtext,
		         SQLINTEGER errcode);
SQLRETURN set_env_error(ENV * env,myodbc_errid errid, const char *errtext,
		        SQLINTEGER errcode);
SQLRETURN copy_str_data(SQLSMALLINT HandleType, SQLHANDLE Handle,
			SQLCHAR FAR *rgbValue, SQLSMALLINT cbValueMax,
			SQLSMALLINT FAR *pcbValue,char FAR *src);
SQLRETURN SQL_API my_SQLAllocEnv(SQLHENV FAR * phenv);
SQLRETURN SQL_API my_SQLAllocConnect(SQLHENV henv, SQLHDBC FAR *phdbc);
SQLRETURN SQL_API my_SQLFreeConnect(SQLHDBC hdbc);
SQLRETURN SQL_API my_SQLFreeEnv(SQLHENV henv);
SQLRETURN SQL_API my_SQLDisconnect(SQLHDBC hdbc);
SQLRETURN SQL_API my_SQLDriverConnect(SQLHDBC hdbc,SQLHWND hwnd,
				      SQLCHAR FAR *szConnStrIn,
				      SQLSMALLINT cbConnStrIn,
				      SQLCHAR FAR *szConnStrOut,
				      SQLSMALLINT cbConnStrOutMax,
				      SQLSMALLINT FAR *pcbConnStrOut,
				      SQLUSMALLINT fDriverCompletion);
char *extend_buffer(NET *net,char *to,ulong length);
void myodbc_end();
my_bool set_dynamic_result(STMT FAR *stmt);
void set_current_cursor_data(STMT FAR *stmt,SQLUINTEGER irow);
my_bool is_minimum_version(const char *server_version,const char *version,
                           uint length);
int _strcasecmp(const char *s, const char *t);
int _casecmp(const char *s, const char *t, uint len);
my_bool reget_current_catalog(DBC FAR *dbc);

#ifndef DBUG_OFF  /* DBUG_RELATED */
void query_print(FILE *log_file,char *query);
FILE *init_query_log(void);
void end_query_log(FILE *query_log);
void init_dbug_log(void);
const char *dbug_stmt_type(SQLUSMALLINT fOption);
const char *dbug_pos_type(SQLUSMALLINT fOption);
const char *dbug_handle_type(SQLSMALLINT fOption);
const char *dbug_tran_type(SQLSMALLINT fOption);

#endif

#ifdef __WIN__
#define cmp_database(A,B) _strcasecmp((const char *)(A),(const char *)(B))
#else
#define cmp_database(A,B) strcmp((A),(B))
#endif

#endif /* __MYUTIL_H__ */
